package com.zhang.admin.util;

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.security.Keys;

import java.security.Key;
import java.util.Date;

/**
 * @title: JWT ：JSON WEB TOKEN的缩写
 * 用户登录时，后端会根据用户信息生成一个JWT令牌，并返回给前端，前端会将JWT令牌保存在浏览器的COOKIES里面
 * 那么前端后续的请求就可以携带JWT令牌向后端发送请求，无需重复登录
 * @author: zhangyf
 * @date: 2023/3/15 14:02
 **/
public class JwtHelper {
    // 令牌的过期时间
    private static long tokenExpiration = 356L * 24 * 60 * 60 * 1000;

    // 加密token的方法
    private static Key key = Keys.hmacShaKeyFor("abcdefghijklmnopqrstuvwxyzasdfasdfsadfasdfasdf".getBytes());

    // 生成token的方法，根据用户id和用户名生成令牌
    public static String createToken(Long userId,String username){
        return Jwts.builder()
                .setSubject("P2P-USER")
                .setExpiration(new Date(System.currentTimeMillis() + tokenExpiration))
                .claim("userId",userId)
                .claim("userName",username)
                .signWith(key)
                .compact();
    }

    // 根据token提取用户ID
    public static Long getUserId(String token){
        try {
           if (token == null) return null;
           // var 关键字，局部变量可以不写类型声明，java可以自动推断局部变量的类型
           var claimsJws = Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(token);
           var claims = claimsJws.getBody();
           var userId = claims.get("userId").toString();
           return Long.parseLong(userId);
        }catch (Exception e){
            e.printStackTrace();
            return null;
        }
    }

    //根据token提取用户名
    public static String getUserName(String token){
        try {
            if (token == null) return null;
            var claimsJws = Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(token);
            var claims = claimsJws.getBody();
            return claims.get("userName").toString();
        }catch (Exception e){
            e.printStackTrace();
            return null;
        }
    }

    public static void main(String[] args) {
        String token = JwtHelper.createToken(1L, "zhangyifan");
        System.out.println(token);
        System.out.println(JwtHelper.getUserId(token));
        System.out.println(JwtHelper.getUserName(token));
    }
}
